use std::collections::HashMap;

pub fn convert_base(num_str: &str, to_base: u32) -> String {
    // 检查目标进制是否合法
    if to_base < 2 || to_base > 16 {
        return Err("目标进制范围应在2-16之间".to_string());
    }

    // 假设输入数字为十进制
    let from_base = 10;

    // 定义一个哈希表，用于将字符映射到数值
    let mut char_to_digit = HashMap::new();
    for i in 0..10 {
        char_to_digit.insert(char::from_digit(i, 10).unwrap(), i);
    }
    for i in 'A'..='F' {
        char_to_digit.insert(i, i as u32 - 'A' as u32 + 10);
    }

    // 将输入字符串转换为十进制数
    let mut decimal_num = 0;
    for c in input.chars() {
        if let Some(&digit) = char_to_digit.get(&c) {
            if digit >= from_base {
                return Err("输入数字包含超出原进制的字符".to_string());
            }
            decimal_num = decimal_num * from_base + digit as u64;
        } else {
            return Err(format!("输入数字包含非法字符: {}", c));
        }
    }

    // 将十进制数转换为目标进制
    let mut result = String::new();
    let mut temp = decimal_num;
    while temp > 0 {
        let remainder = temp % to_base;
        result.push(char_to_digit.iter().find(|(_, &v)| v == remainder).unwrap().0);
        temp /= to_base;
    }
    Ok(result.chars().rev().collect())
}
